package com.tcc.etec.mecashow.activity;

import java.sql.Timestamp;
import java.util.List;
import java.util.Random;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.view.Display;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import com.tcc.etec.mecashow.R;
import com.tcc.etec.mecashow.bdados.PerguntaDao;
import com.tcc.etec.mecashow.bdados.RecordeDao;
import com.tcc.etec.mecashow.objetos.Pergunta;
import com.tcc.etec.mecashow.objetos.Recorde;
import com.tcc.etec.mecashow.util.Utils;

public class ControlePerguntasActivity extends Activity {
	
	private int qtdPulo = 3; // atributo da classe Splash q armazena quantidade de pulos disponiveis
	private int qtdAjuda = 3; // atributo da classe Splash q armazena quantidade de ajuda disponiveis
	private int nivel = 1; // atributo da classe Splash q armazena o nivel atual do jogo
	private int pontuacao = 0; // atributo da classe Splash q armazena quantidade da pontuação atual do jogo
	private List<Pergunta> listaDePerguntas; // armazena a lista com 10 perguntas por nível
	private boolean start = true;

	private View mContentView;
	private View mViewFade;
	private int mShortAnimationDuration;

	private Dialog dialogAcertou;
	private Dialog dialogErrou;
	private Dialog dialogParabens;
	
	private AlertDialog dialogRecord;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.splash_perguntas);
		
		listaDePerguntas = PerguntaDao.getInstance(this).listarPerguntasPeloNivel(nivel);
		mContentView = findViewById(R.id.msg_splash);
		mViewFade = findViewById(R.id.view_fade);
        mShortAnimationDuration = getResources().getInteger(android.R.integer.config_longAnimTime);
        
        dialogAcertou = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
    	dialogAcertou.setContentView(R.layout.dialog_certa_resposta);
    	
    	final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    	final View view = getLayoutInflater().inflate(R.layout.dialog_record, null, false);
    	builder.setView(view);
    	builder.setPositiveButton("Salvar", new OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				EditText text = (EditText) view.findViewById(R.id.nome_recorde);
				Recorde recorde = new Recorde();
				recorde.setData(new Timestamp(System.currentTimeMillis()));
				recorde.setNomeJogador(text.getText().toString());
				recorde.setPontos(pontuacao);
				RecordeDao.getInstance(getApplicationContext()).salvarRecordes(recorde);
				dialog.dismiss();
				finish();
			}
		});
    	builder.setNegativeButton("Cancelar", new OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
				finish();
			}
		});
    	builder.setCancelable(false);
    	dialogRecord = builder.create();
    	
    	dialogErrou = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
    	dialogErrou.setContentView(R.layout.dialog_resposta_errada);
    	
    	dialogParabens = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
    	dialogParabens.setContentView(R.layout.dialog_parabens);
	}

	@SuppressWarnings("deprecation")
	@Override
	protected void onStart() {
		super.onStart();
		
		final Display display = getWindowManager().getDefaultDisplay();
        final Point point = new Point();
        display.getSize(point);
        getWindow().getDecorView().getRootView().setBackgroundDrawable(new BitmapDrawable(getResources(), Utils.getBackgroundImage(getResources(), R.drawable.papirus, point.x, point.y)));

		// Recupera o textview q exibe a pontuação na tela de splash
		TextView txtPontos = (TextView) findViewById(R.id.txt_splash_pontos);
		// Verifica o nivel atual para selecionar o texto de pontuação ( 10, 50 ou 100)
		switch (nivel) {
		case 1:
			txtPontos.setText(R.string.txt_10); // busca o texto definido no arquivo strings.xml da pasta values
			break;
		case 2:
			txtPontos.setText(R.string.txt_50); // busca o texto definido no arquivo strings.xml da pasta values
			break;
		case 3:
			txtPontos.setText(R.string.txt_100); // busca o texto definido no arquivo strings.xml da pasta values
			break;
		}
		
		if(start){
			start = false;
			new Handler().postDelayed( new Thread() {
				public void run() {
					iniciarNovaPergunta();
				}
			},1500); // 1500 milisegundos é o tempo de espera
		}
	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if(data != null && data.getBooleanExtra(PerguntaActivity.TEM_AJUDA, false)){
			qtdAjuda--;
		}		
		switch (resultCode) {
		case 770: // RESPOSTA ERRADA
			tratarRespostaErrada();
			break;
		case 771: // CERTA RESPOSTA
			tratarRespostaCerta();
			break;
		case 772: // PULAR
			tratarPulo();
			break;
		case 773: // PARAR
			tratarParar();
			break;
		}
	}

	private void tratarParar() {
		mContentView.setVisibility(View.GONE);
		tratarRecorde(false);
	}

	private void tratarPulo() {
		qtdPulo--; 
		if(listaDePerguntas.isEmpty() && nivel < 3){
			nivel++;
			listaDePerguntas = PerguntaDao.getInstance(ControlePerguntasActivity.this).listarPerguntasPeloNivel(nivel);
		}
		new Handler().postDelayed( new Thread() {
			public void run() {
				iniciarNovaPergunta();
			}
		},1500);
	}

	private void tratarRespostaErrada() {
		mContentView.setVisibility(View.GONE);
		
		dialogErrou.show();
		
		new Handler().postDelayed( new Thread() {
			public void run() {
				dialogErrou.dismiss();
				tratarRecorde(false);
			}
		},1500);
	}

	private void tratarRespostaCerta() {
		mContentView.setVisibility(View.GONE);
		mViewFade.setVisibility(View.VISIBLE);
		atualizarPlacar();
		
		dialogAcertou.show();
		
		if(listaDePerguntas.isEmpty() && nivel < 3){
			nivel++;
			listaDePerguntas = PerguntaDao.getInstance(ControlePerguntasActivity.this).listarPerguntasPeloNivel(nivel);
		} 
		if(listaDePerguntas.isEmpty() && nivel == 3){
			new Handler().postDelayed( new Thread() {
				public void run() {
					dialogAcertou.dismiss();
					tratarRecorde(true);
				}
			},2000);
			
		}else{
			new Handler().postDelayed( new Thread() {
				public void run() {
					dialogAcertou.dismiss();
					crossfade();
					new Handler().postDelayed( new Thread() {
						public void run() {
							iniciarNovaPergunta();
						}
					},1500);
				}
			},1500);
			
		}
	}
	
	private void tratarRecorde(boolean isUltima){
		if(pontuacao > 0 && RecordeDao.getInstance(this).isRecorde(pontuacao)){
			if(isUltima){
				dialogParabens.show();
				new Handler().postDelayed(new Thread() {
					@Override
					public void run() {
						dialogParabens.hide();
						dialogRecord.show();
					}
				}, 2000);
			} else {
				dialogRecord.show();
			}
		} else {
			finish();
		}
	}
	
	public void onBackPressed() {
		//não deve permitir o botão voltar
	}	
	
	private void iniciarNovaPergunta() {
		//Ação realizada apos o tempo
		Intent intent = new Intent(ControlePerguntasActivity.this, PerguntaActivity.class);
		intent.putExtra(PerguntaActivity.PONTUACAO, pontuacao);
		
		if (nivel==3 && listaDePerguntas.size()==1){
			intent.putExtra(PerguntaActivity.QTD_AJUDA, 0 );
			intent.putExtra(PerguntaActivity.QTD_PULO, 0 );
		}else{
			intent.putExtra(PerguntaActivity.QTD_AJUDA, qtdAjuda);
			intent.putExtra(PerguntaActivity.QTD_PULO, qtdPulo);
		}
		
		Pergunta pergunta = listaDePerguntas.remove(0);
		pergunta.setRandom(new Random().nextInt(10));
		
		PerguntaDao.getInstance(ControlePerguntasActivity.this).atualizarUsoDaPergunta(pergunta);
		
		intent.putExtra(PerguntaActivity.PERGUNTA, pergunta);
		startActivityForResult(intent, 777); // Inicia a PerguntaActivity e espera por um resultado
	}
	
	private void atualizarPlacar(){
		switch (nivel) {
		case 1:
			pontuacao += 10;
			break;
		case 2:
			pontuacao += 50;
			break;
		case 3:
			pontuacao += 100;
			break;			
		}
	}

	private void crossfade() {
	    mContentView.setAlpha(0f);
	    mContentView.setVisibility(View.VISIBLE);
		mContentView.animate().alpha(1f).setDuration(mShortAnimationDuration).setListener(null);

		mViewFade.animate().alpha(0f).setDuration(mShortAnimationDuration).setListener(new AnimatorListenerAdapter() {
					@Override
					public void onAnimationEnd(Animator animation) {
						mViewFade.setVisibility(View.GONE);
					}
		});
	}
	
}
